/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.CapaFisica;
import fisica.EnfermedadYDiagnosticoAmbulatorioFisica;
import hibernate.objeto.Cie9mc;
import hibernate.objeto.EnfermedadYDiagnosticoAmbulatorio;
import hibernate.objeto.Evolucion;
import hibernate.objeto.Interconsulta;
import hibernate.objeto.Paciente;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.Vector;
import presentacion.CapaPresentacion;

/**
 *
 * @author Gonzalo
 */
public class EnfermedadYDiagnosticoAmbulatorioLogica extends CapaLogica {

    /**
     * Crea y persiste la enfermedad y el diagnóstico para el paciente.
     *
     * @param datosEnfermedadYDiagnosticoAmbulatorio Los datos a cargar
     * correspondientes a la enfermedad y diagnóstico
     * @param paciente El objeto Paciente
     * @param enfermedadYDiagnosticoAmbulatorio La enfermedad que se está
     * agregando/modificando
     * @param idEnfermedadYDiagnosticoAmbulatorio El arreglo en donde se guarda
     * el id del objeto EnfermedadYDiagnosticoAmbulatorio creado para su posterior
     * recuperación
     * @return true si se agregó correctamente, false en caso contrario
     */
    public static boolean agregarEnfermedadYDiagnosticoAmbulatorio(
            Object[] datosEnfermedadYDiagnosticoAmbulatorio, Paciente paciente,
            EnfermedadYDiagnosticoAmbulatorio enfermedadYDiagnosticoAmbulatorio,
            int[] idEnfermedadYDiagnosticoAmbulatorio) {

        //Si es una modificacion
        if (idEnfermedadYDiagnosticoAmbulatorio[0] != -1) {
            //Escribe el log
            backUpModificacion(idEnfermedadYDiagnosticoAmbulatorio[0]);
        }

        enfermedadYDiagnosticoAmbulatorio =
                crearUObtenerObjetoEnfermedadYDiagnosticoAmbulatorio(
                datosEnfermedadYDiagnosticoAmbulatorio, paciente,
                enfermedadYDiagnosticoAmbulatorio);

        //Persiste el objeto
        if (CapaFisica.guardarOActualizarObjeto(enfermedadYDiagnosticoAmbulatorio)) {
            idEnfermedadYDiagnosticoAmbulatorio[0] = enfermedadYDiagnosticoAmbulatorio.
                    getIdEnfermedadYDiagnosticoAmbulatorio();
            return true;
        } else {
            return false;
        }
    }

    /**
     * Crea un objeto EnfermedadYDiagnosticoAmbulatorio con los datos pasados por parámetro.
     *
     * @param datosEnfermedadYDiagnosticoAmbulatorio Los datos a cargar
     * @param paciente El objeto Paciente
     * @param enfermedadYDiagnosticoAmbulatorio La enfermedad que se está
     * creando/obteniendo
     * @return El objeto EnfermedadYDiagnosticoAmbulatorio creado
     */
    private static EnfermedadYDiagnosticoAmbulatorio
            crearUObtenerObjetoEnfermedadYDiagnosticoAmbulatorio(Object[]
            datosEnfermedadYDiagnosticoAmbulatorio, Paciente paciente,
            EnfermedadYDiagnosticoAmbulatorio enfermedadYDiagnosticoAmbulatorio) {

        if (enfermedadYDiagnosticoAmbulatorio == null) {
            enfermedadYDiagnosticoAmbulatorio =
                    new EnfermedadYDiagnosticoAmbulatorio();
        }
        
        enfermedadYDiagnosticoAmbulatorio.
                setHoraEnfermedadYDiagnosticoAmbulatorio(
                (String) datosEnfermedadYDiagnosticoAmbulatorio[
                ENFERMEDAD_Y_DIAGNOSTICO_AMBULATORIO_HORA]);

        enfermedadYDiagnosticoAmbulatorio.
                setFechaEnfermedadYDiagnosticoAmbulatorio(
                (Date) datosEnfermedadYDiagnosticoAmbulatorio[
                ENFERMEDAD_Y_DIAGNOSTICO_AMBULATORIO_FECHA]);

        enfermedadYDiagnosticoAmbulatorio.setCie9mc(
                (Cie9mc) datosEnfermedadYDiagnosticoAmbulatorio[
                ENFERMEDAD_Y_DIAGNOSTICO_AMBULATORIO_CIE9MC]);

        enfermedadYDiagnosticoAmbulatorio.
                setDiagnosticoEnfermedadYDiagnosticoAmbulatorio(
                (String) datosEnfermedadYDiagnosticoAmbulatorio[
                ENFERMEDAD_Y_DIAGNOSTICO_AMBULATORIO_DIAGNOSTICO]);

        enfermedadYDiagnosticoAmbulatorio.
                setDescripcionDiagnosticoEnfermedadYDiagnosticoAmbulatorio(
                (String) datosEnfermedadYDiagnosticoAmbulatorio[
                ENFERMEDAD_Y_DIAGNOSTICO_AMBULATORIO_DESCRIPCION_DIAGNOSTICO]);

        enfermedadYDiagnosticoAmbulatorio.
                setEstadoEnfermedadYDiagnosticoAmbulatorio("Activa");

        //Seteo del paciente
        enfermedadYDiagnosticoAmbulatorio.setPaciente(paciente);

        return enfermedadYDiagnosticoAmbulatorio;
    }

    /**
     * Finaliza la enfermedad y la agrega como un antecedente personal.
     *
     * @param paciente El paciente asociado
     * @param enfermedadYDiagnosticoAmbulatorio La enfermedad a finalizar
     * @return El objeto EnfermedadYDiagnosticoAmbulatorio si se pudo finalizar
     * null en caso contrario
     */
    public static EnfermedadYDiagnosticoAmbulatorio finalizarEnfermedad(
            Paciente paciente,
            EnfermedadYDiagnosticoAmbulatorio enfermedadYDiagnosticoAmbulatorio) {
        enfermedadYDiagnosticoAmbulatorio.setEstadoEnfermedadYDiagnosticoAmbulatorio(
                "No activa");

        if (CapaFisica.guardarOActualizarObjeto(enfermedadYDiagnosticoAmbulatorio)) {
            AntecedentePersonalLogica.setearEnfermedadComoAntecedente(paciente,
                    enfermedadYDiagnosticoAmbulatorio);
            
            return enfermedadYDiagnosticoAmbulatorio;
        } else {
            return null;
        }
    }

    /**
     * Retorna el vector de Enfermedades que un paciente tiene asociadas.
     *
     * @param idPaciente El id del paciente a consultar
     * @return El vector de objetos EnfermedadYDiagnosticoAmbulatorio consultado
     */
    public static Vector<EnfermedadYDiagnosticoAmbulatorio>
            getVectorEnfermedadYDiagnosticoAmbulatorioPorIdPaciente(int idPaciente) {
        return EnfermedadYDiagnosticoAmbulatorioFisica.
                getVectorEnfermedadYDiagnosticoAmbulatorioPorIdPaciente(
                idPaciente);
    }

    /**
     * Retorna el objeto EnfermedadYDiagnosticoAmbulatorio según el id.
     *
     * @param idEnfermedadYDiagnosticoAmbulatorio El id de la 
     * EnfermedadYDiagnosticoAmbulatorio
     * @return El objeto EnfermedadYDiagnosticoAmbulatorio consultado, null si
     * no existe
     */
    public static EnfermedadYDiagnosticoAmbulatorio
            getEnfermedadYDiagnosticoAmbulatorioPorId(
            int idEnfermedadYDiagnosticoAmbulatorio) {
        return EnfermedadYDiagnosticoAmbulatorioFisica.
                getEnfermedadYDiagnosticoAmbulatorioPorId(
                idEnfermedadYDiagnosticoAmbulatorio);
    }

    /**
     * Escribe un archivo de texto el cual es una imagen del objeto que se
     * ha modificado y sus objetos asociados, guardando el mismo en la tabla.
     *
     * @param idObjeto El id del objeto a resguardar
     */
    private static void backUpModificacion(int idObjeto) {
        String rutaLogLocal = DIRECTORIO_DE_TRABAJO + "\\" +
                    EnfermedadYDiagnosticoAmbulatorio.class.getName() + ".txt";
        //Se recupera el objeto para recupera el archivo
        EnfermedadYDiagnosticoAmbulatorio enfermedadYDiagnosticoAmbulatorio =
                EnfermedadYDiagnosticoAmbulatorioLogica.
                getEnfermedadYDiagnosticoAmbulatorioPorId(idObjeto);

        File log = CapaLogica.byteArrayToFile(rutaLogLocal,
                enfermedadYDiagnosticoAmbulatorio.getArchivoLogEnfermedadYDiagnosticoAmbulatorio());

        if (log == null) {
            log = new File(rutaLogLocal);
        }

        //Se manipula el log
        escribirLogEnfermedadYDiagnosticoAmbulatorio(
                enfermedadYDiagnosticoAmbulatorio, rutaLogLocal);

        //Se guarda
        byte[] bFile = new byte[(int) log.length()];

        try {
            FileInputStream fileInputStream = new FileInputStream(log);
            //convert file into array of bytes
            fileInputStream.read(bFile);
            fileInputStream.close();
        } catch (Exception exc) {
            System.err.println(exc.getMessage());
        }

        //Setea el adjunto
        enfermedadYDiagnosticoAmbulatorio.setArchivoLogEnfermedadYDiagnosticoAmbulatorio(
                bFile);
        eliminarArchivosTemporales();
    }

    /**
     * Escribe el objeto en un archivo.
     *
     * @param enfermedadYDiagnosticoAmbulatorio El objeto a resguardar
     * @param log El archivo en donde escribir
     * @return true si se escribio correctamente, false en caso contrario
     */
    public static boolean escribirLogEnfermedadYDiagnosticoAmbulatorio(
            EnfermedadYDiagnosticoAmbulatorio enfermedadYDiagnosticoAmbulatorio,
            String rutaLog) {

        try {
            //EnfermedadYDiagnosticoAmbulatorio
            String enfermedadYDiagnosticoAmbulatorioString =
                    getEnfermedadYDiagnosticoAmbulatorioString(
                    enfermedadYDiagnosticoAmbulatorio);

            //Evoluciones
            Vector<Evolucion> vectorEvolucion = EvolucionLogica.
                    getVectorEvolucionPorIdEnfermedadYDiagnosticoAmbulatorio(
                    enfermedadYDiagnosticoAmbulatorio.getIdEnfermedadYDiagnosticoAmbulatorio());
            if (vectorEvolucion != null) {
                for (int i = 0; i < vectorEvolucion.size(); i++) {
                    enfermedadYDiagnosticoAmbulatorioString += SEPARADOR;
                    enfermedadYDiagnosticoAmbulatorioString +=
                            EvolucionLogica.getEvolucionString(
                            vectorEvolucion.get(i));
                }
            }

            Vector<Interconsulta> vectorInterconsultas = InterconsultaLogica.
                    getVectorInterconsultaPorIdEnfermedadYDiagnosticoAmbulatorio(
                    enfermedadYDiagnosticoAmbulatorio.getIdEnfermedadYDiagnosticoAmbulatorio());
            if (vectorInterconsultas != null) {
                for (int i = 0; i < vectorInterconsultas.size(); i++) {
                    enfermedadYDiagnosticoAmbulatorioString += SEPARADOR;
                        enfermedadYDiagnosticoAmbulatorioString +=
                                InterconsultaLogica.getInterconsultaString(
                                vectorInterconsultas.get(i));
                }
            }

            BufferedWriter bw = new BufferedWriter(new FileWriter(rutaLog, true));
            enfermedadYDiagnosticoAmbulatorioString += "\n" + SEPARADOR + "\n";
            //Escribe los datos del objeto
            bw.write(enfermedadYDiagnosticoAmbulatorioString);

            bw.close();
        } catch (IOException exception) {
            System.err.println(exception.getMessage());
            return false;
        }

        return true;
    }

    /**
     * Retorna todo el objeto EnfermedadYDiagnosticoAmbulatorio en string.
     *
     * @param enfermedadYDiagnosticoAmbulatorio El objeto a escribir
     */
    public static String getEnfermedadYDiagnosticoAmbulatorioString(
            EnfermedadYDiagnosticoAmbulatorio enfermedadYDiagnosticoAmbulatorio) {
        String enfermedadYDiagnosticoAmbulatorioString =
                    "idPaciente: " +
                    enfermedadYDiagnosticoAmbulatorio.getPaciente().getIdPaciente() + "\n" +
                    "idEnfermedadYDiagnosticoAmbulatorio: " +
                    enfermedadYDiagnosticoAmbulatorio.getIdEnfermedadYDiagnosticoAmbulatorio() + "\n" +
                    "horaEnfermedadYDiagnosticoAmbulatorio: " +
                    enfermedadYDiagnosticoAmbulatorio.getHoraEnfermedadYDiagnosticoAmbulatorio() + "\n" +
                    "fechaEnfermedadYDiagnosticoAmbulatorio: " +
                    enfermedadYDiagnosticoAmbulatorio.getFechaEnfermedadYDiagnosticoAmbulatorio() + "\n";

        enfermedadYDiagnosticoAmbulatorioString += Cie9mcLogica.getCie9mcString(
                enfermedadYDiagnosticoAmbulatorio.getCie9mc());

        enfermedadYDiagnosticoAmbulatorioString +=
                "diagnosticoEnfermedadYDiagnosticoAmbulatorio: " +
                enfermedadYDiagnosticoAmbulatorio.getDiagnosticoEnfermedadYDiagnosticoAmbulatorio() + "\n" +
                "descripcionDiagnosticoEnfermedadYDiagnosticoAmbulatorio: " +
                enfermedadYDiagnosticoAmbulatorio.getDescripcionDiagnosticoEnfermedadYDiagnosticoAmbulatorio() + "\n" +
                "estadoEnfermedadYDiagnosticoAmbulatorio: " +
                enfermedadYDiagnosticoAmbulatorio.getEstadoEnfermedadYDiagnosticoAmbulatorio() + "\n";

        return enfermedadYDiagnosticoAmbulatorioString;
    }

    /**
     * Retorna el texto HTML correspondiente a la descripcion de la 
     * EnfermedadYDiagnosticoAmbulatorio.
     *
     * @param enfermedadYDiagnosticoAmbulatorio La Enfermedad
     * @return El String que contiene el HTML
     */
    public static String getEnfermedadYDiagnosticoAmbulatorioHTML(
            EnfermedadYDiagnosticoAmbulatorio enfermedadYDiagnosticoAmbulatorio) {
        String enfermedadYDiagnosticoHTML = "";

        if (enfermedadYDiagnosticoAmbulatorio != null) {
            String evolucionHTML = "";
            String interconsultaHTML = "";

        //Evoluciones
            Vector<Evolucion> vectorEvolucion = EvolucionLogica.
                    getVectorEvolucionPorIdEnfermedadYDiagnosticoAmbulatorio(
                    enfermedadYDiagnosticoAmbulatorio.getIdEnfermedadYDiagnosticoAmbulatorio());
            if (vectorEvolucion != null) {
                for (int i = 0; i < vectorEvolucion.size(); i++) {
                    evolucionHTML += "</font><br><br><hr /><hr /><br>";
                    evolucionHTML += EvolucionLogica.getEvolucionHTML(
                            vectorEvolucion.get(i));
                }
            }

        //Interconsultas
            Vector<Interconsulta> vectorInterconsultas = InterconsultaLogica.
                    getVectorInterconsultaPorIdEnfermedadYDiagnosticoAmbulatorio(
                    enfermedadYDiagnosticoAmbulatorio.getIdEnfermedadYDiagnosticoAmbulatorio());
            if (vectorInterconsultas != null) {              
                for (int i = 0; i < vectorInterconsultas.size(); i++) {
                    interconsultaHTML += "</font><br><br><hr /><hr /><br>";
                    interconsultaHTML += InterconsultaLogica.getInterconsultaHTML(
                            vectorInterconsultas.get(i));
                }
            }


        enfermedadYDiagnosticoHTML =
                    "<font size=\"3\" face=\"arial\" color=\"blue\">ENFERMEDAD</font><br><br> "
                    + "<hr /><font size=\"3\" face=\"arial\" color=\"blue\">Fecha: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    CapaPresentacion.imprimirFecha(enfermedadYDiagnosticoAmbulatorio.
                    getFechaEnfermedadYDiagnosticoAmbulatorio()) + " - " +
                    enfermedadYDiagnosticoAmbulatorio.getHoraEnfermedadYDiagnosticoAmbulatorio() + "</font><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Estado: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    CapaLogica.capitalizeFirstLetter(enfermedadYDiagnosticoAmbulatorio.
                    getEstadoEnfermedadYDiagnosticoAmbulatorio()) + "</font><br><hr /><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Nombre de la enfermedad: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    enfermedadYDiagnosticoAmbulatorio.getCie9mc().getDetalleCie9mc() + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Diagnóstico: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    enfermedadYDiagnosticoAmbulatorio.
                    getDiagnosticoEnfermedadYDiagnosticoAmbulatorio() + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Descripcion: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    enfermedadYDiagnosticoAmbulatorio.
                    getDescripcionDiagnosticoEnfermedadYDiagnosticoAmbulatorio()
                    + evolucionHTML
                    + interconsultaHTML + "</font><br><br>";

                return enfermedadYDiagnosticoHTML;
        } else {
            enfermedadYDiagnosticoHTML = "<font size=\"3\" face=\"arial\" color=\"blue\">ENFERMEDAD</font><br><br> " +
                    "<hr /><font size=\"3\" face=\"arial\">No posee</font><br></font><hr />";
        }

        return enfermedadYDiagnosticoHTML;
    }

}